#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# author：samge
# date：2024-08-06 09:30
# describe：

import os
from flask import Flask, render_template, request, redirect
from flask_mysqldb import MySQL
import MySQLdb.cursors

import settings
from utils import uid_utils

app = Flask(__name__)

# 使用配置文件的方式加载数据库配置
for k, v in settings.MYSQL_CONFIG.items():
    app.config[k] = v

# 数据库的配置一般从配置文件中读取，或者从环境变量中读取，测试时可随便选择。测试时也可直接像下面注释的这样直接在代码层配置数据库信息
# app.config['MYSQL_HOST'] = '数据库服务器ip'          # 数据库服务器ip
# app.config['MYSQL_PORT'] = 3306                     # 数据库服务端口
# app.config['MYSQL_USER'] = '数据库用户名'            # 数据库用户名
# app.config['MYSQL_PASSWORD'] = '数据库密码'          # 数据库密码
# app.config['MYSQL_DB'] = '数据库名'                  # 数据库名

mysql = MySQL(app)

# 首页
@app.route('/')
def index():
    cursor = mysql.connection.cursor(MySQLdb.cursors.DictCursor)
    cursor.execute('SELECT * FROM users')
    users = cursor.fetchall()
    return render_template('index.html', users=users)

# 业务：添加用户
@app.route('/add', methods=['POST'])
def add():
    # 读取前端传过来的用户信息，这里测试时没有校验，直接入口。正式环境应该检验用户信息有效性，校验通过后才能进行入口操作。同时需要做好“SQL注入”的防护
    name = request.form['name']
    pw = request.form['pw']
    uid = uid_utils.generate_uid()  # 模拟生成唯一的uid，这里不严谨，仅测试用
    cursor = mysql.connection.cursor()
    cursor.execute('INSERT INTO users (uid, name, pw) VALUES (%s, %s, %s)', (uid, name, pw))
    mysql.connection.commit()
    return redirect('/')

# 业务：更新用户信息
@app.route('/update/<int:uid>', methods=['POST'])
def update(uid):
    name = request.form['name']
    cursor = mysql.connection.cursor()
    cursor.execute('UPDATE users SET name = %s WHERE uid = %s', (name, uid))
    mysql.connection.commit()
    return redirect('/')

# 业务：删除用户信息
@app.route('/delete/<int:uid>')
def delete(uid):
    cursor = mysql.connection.cursor()
    cursor.execute('DELETE FROM users WHERE uid = %s', (uid,))
    mysql.connection.commit()
    return redirect('/')


# 程序主入口
if __name__ == "__main__":
    os.environ['FLASK_ENV'] = 'development' if settings.DEBUG else 'production'     # 标记为开发环境，支持热加载，正式环境需要移除该配置或者显式配置为'production' 
    app.run(host='0.0.0.0', port=5000, debug=settings.DEBUG)                        # debug=True标记为调试模式，允许输出详细日志，正式环境需要配置为False，避免泄露信息
